package org.orm.hsc.session;

import com.domain.Car;
import com.sql.CarSql;

import java.util.List;

/**
 * @author
 * @date 2025-04-16
 * @Description 将统一对外的接口提前到SqlSession接口 后续使用者只需要通过SqlSession 就可以操作数据
 */
public interface SqlSession {
    //------------------------旧的api

    /**
     * 对外提供增的方法
     * 这里方法提供将主键值设置到对象的字段中
     *
     * @param sql
     * @param paramObj
     * @param cno
     * @return
     */
    int insert(String sql, Object paramObj, String cno);

    /**
     * 重载的方法 提供执行的参数 以及 是否生成主键值
     *
     * @param sql
     * @param paramObj
     * @param isGeneratedKey
     * @return
     */
    int insert(String sql, Object paramObj, boolean isGeneratedKey);

    /**
     * 插入重载的放 只需要同一个sql语句便可以执行
     * @param sql
     * @return
     */
    int insert(String sql);

    /**
     * 插入重载的方法 提供一个sql 和 sql的参数
     * @param sql
     * @param paramObj
     * @return
     */
    int insert(String sql, Object paramObj);

    /**
     * 对外提供接口 进行事务的提交
     */
    void commit();

    /**
     * 对外提供接口 进行事务的回滚
     */
    void rollback();

    /**
     * 对外提供接口 进行关闭连接
     */
    void Close();

    public int update(String sql, Object paramObj);

    public int update(String sql);

    public int delete(String sql, Object paramObj);

    public int delete(String sql);


    public <T> List<T> selectList(String sql, Object paramObj, Class<T> rowType);

    public <T> List<T> selectList(String sql, Class<T> rowType);

    public <T> T selectOne(String sql, Object paramObj, Class<T> rowType);

    public <T> T selectOne(String sql, Class<T> rowType);


    //---------------动态sql新增API----------------
    // 使用注解的方法来声明 sql

    /**
     * @param sqlid    获取反射类对应sqlId
     * @param paramObj 存储sql 数据对象
     * @return
     */
    int save(String sqlid, Object paramObj);

    int save(String sqlid);

    // 修改的方法
    int modify(String sqlid);

    int modify(String sqlid, Object paramObj);

    // 删除的方法
    int remove(String sqlid);

    int remove(String sqlid, Object paramObj);

    // 查询列表
    <T> List<T> searchList(String sqlid);

    <T> List<T> searchList(String sqlid, Object paramObj);

    // 查询一个
    <T> T searchOne(String sqlid);

    <T> T searchOne(String sqlid, Object paramObj);

    //--------------dao代理相关的api-----------------
    <T> T getDaoProxy(Class<T> classType);
}
